﻿// 动态扩容数组.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

/*数组的动态扩容
 * 开辟一个动态数组
 * 1.初始化INit
 * 2.销毁动态数组DESTORY
 * 3.尾部添加元素pushback
 * 4.尾部删除元素,并返回删除元素的值popback
 * 5.给数组的第pos位添加元素insert
 * 6.删除数组的第pos位元素，并返回其元素值remove
 * 7.打印数组showarray
 */
 //arr结构
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<iostream>
#define size 5
struct Arr
{
    int* p;
    int num;//有效元素个数
    int count;//容量
};

//初始化
void Init(Arr* arr)
{
    arr->num = 0;
    arr->count = size;
    arr->p = (int*)malloc(sizeof(int) * size);
    if (arr->p == NULL)
    {
        exit(-1);
    }
}

//销毁一个动态数组
void Destory(Arr* arr)
{
    free(arr->p);
    arr->p = NULL;
    
}
//扩容
void krarr(Arr* arr)
{
    int* p1 = (int*)malloc(sizeof(int) * 2 * arr->count);
    if (p1 == NULL)
        exit(-1);
    memcpy(p1, arr->p, sizeof(int) * arr->count);
    free(arr->p);
    arr->p = p1;
    arr->count *= 2;
}


//尾部添加元素
void Pushback(Arr* arr, int val)
{
    if (arr->num == arr->count)//如果空间满了，动态扩容
    {
        krarr(arr);
    }
    arr->p[arr->num] = val;
    arr->num++;
}


//尾部删除元素，并返回元素值val
void Popback(Arr* arr, int* val)
{
    *val = arr->p[arr->num-1];
    arr->num--;
}


//在数组的第pos位增加元素val
void Initsert(Arr* arr, int pos, int val)
{
    if (arr->count == arr->num)
    {
        krarr(arr);
    }
    for (int i = arr->num - 1; i >= pos-1; i--)
    {
        arr->p[i + 1] = arr->p[i];
    }
    arr->num++;
    arr->p[pos - 1] = val;
}


//删除数组中第pos位元素，并返回val
void Remove(Arr* arr, int pos,int* val)
{
    *val = arr->p[pos - 1];
    for (int i = pos; i < arr->num; i++)
    {
        arr->p[i - 1] = arr->p[i];
    }
    arr->num--;
    
}


//打印数组元素
void Showarr(Arr* arr)
{
    for (int i = 0; i < arr->num; i++)
    {
        printf("%d  ", arr->p[i]);
    }
    printf("\n");
}




int main()
{
    Arr arr;
    Init(&arr);
    Pushback(&arr, 10);//尾部插入元素
    Pushback(&arr, 20);
    Pushback(&arr, 30);
    Pushback(&arr, 23);
    Pushback(&arr, 25);
    Pushback(&arr, 60);
    Pushback(&arr, 30);
    Showarr(&arr);//打印数组
    
    int val = 0;
    Remove(&arr, 3,&val);//删除第3位，并返回其值
    printf("%d\n", val);
    Showarr(&arr);

    Initsert(& arr, 3, 50);//在第3位增加50；
    Showarr(&arr);

    Popback(&arr, &val);//尾部删除元素
    printf("%d\n", val);

    Destory(&arr);//

}